#include <iostream>
using namespace std;

class AbstractBase {
public:
  virtual void func1() = 0;
  virtual void func2() = 0;
  int a;
  int b;
};

class Derived1 : public AbstractBase {
  public:
    void func1() {
      cout << "Derived1::func1()" << endl;
    }
    void func2() {
      cout << "Derived1::func2()" << endl;
    }
    int a;
    int b;
};

void runFunc1(AbstractBase &b) {
  b.func1();
  typedef void (*PFN)();
  // 通过 vptr 运行 func1()
  // 获取虚函数表地址，（指针数组的地址）
  PFN * vtbl_addr = *(PFN **)(&b);
  // vtbl_addr 是数组首地址
  vtbl_addr[0]();
  // 运行 func2()
  // vtbl_addr[1]();
}

void test() {
  Derived1 d;
  // 内存大小24, 为 vptr 的大小 
  // 继承抽象类也分配内存空间，也有虚函数表
  cout << "Drived1 内存大小" << sizeof(d) << endl;
  runFunc1(d);

  d.a = 10;
  d.AbstractBase::a = 20;
  cout << "d.a: " << d.a
       << "\td.AbstractBase::a: " << d.AbstractBase::a
       << endl;

}

int main() {
  test();
  return 0;
}
